package com.example.deepai.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
@RequiredArgsConstructor
public class UIRecognitionService {
    private final QwenVisionService qwenService;
    
    // 删除重复的方法，合并功能
    // 删除第二个 recognizeUI 方法，修改第一个方法的返回类型和实现
    public Map<String, Object> recognizeUI(String input) throws IOException {
        String base64Image;
        if (input.startsWith("data:image") || input.matches("^[A-Za-z0-9+/]+={0,2}$")) {
            // 输入已经是 base64 格式
            base64Image = input;
        } else {
            // 输入是文件路径，需要读取并转换
            byte[] imageBytes = Files.readAllBytes(Path.of(input));
            base64Image = java.util.Base64.getEncoder().encodeToString(imageBytes);
        }
        
        // 构建提示词
        String prompt = buildPrompt();
        
        try {
            String aiResponse = qwenService.analyzeImage(base64Image, prompt);
            log.info("原始响应: {}", aiResponse);
            
            String jsonResponse = extractJsonFromResponse(aiResponse);
            log.info("提取的 JSON: {}", jsonResponse);
            
            return parseResponse(jsonResponse);
        } catch (Exception e) {
            log.error("UI 识别失败", e);
            return createFallbackResponse(e.getMessage());
        }
    }
    
    private String buildPrompt() {
        return """
            请以中文分析图片中的所有UI元素。
            请严格按照以下JSON格式返回分析结果：
            {
                "elements": [
                    {
                        "type": "按钮|输入框|文本|图片",
                        "position": {"x": 100, "y": 200, "width": 80, "height": 30},
                        "text": "元素文本内容",
                        "attributes": {"enabled": "是否启用", "visible": "是否可见"},
                        "children": []
                    }
                ],
                "layout": {
                    "type": "线性布局|相对布局|绝对布局",
                    "orientation": "垂直|水平"
                }
            }
            
            注意事项：
            1. 所有描述使用中文
            2. 准确识别每个UI元素的类型和属性
            3. 详细描述元素的位置信息
            4. 清晰标注元素间的层级关系
            """;
    }
    
    private String extractJsonFromResponse(String response) {
        try {
            // 如果响应本身就是一个JSON对象
            if (response.startsWith("{") && response.endsWith("}")) {
                // 尝试解析为JSON对象
                ObjectMapper mapper = new ObjectMapper();
                JsonNode node = mapper.readTree(response);
                // 如果包含 current_analysis，提取其中的文本内容
                if (node.has("current_analysis") && node.get("current_analysis").has("text")) {
                    String analysisText = node.get("current_analysis").get("text").asText();
                    // 移除可能的 ```json 和 ``` 标记
                    if (analysisText.contains("```json")) {
                        analysisText = analysisText.substring(
                            analysisText.indexOf("```json") + 7,
                            analysisText.lastIndexOf("```")
                        ).trim();
                    }
                    return analysisText;
                }
                return response;
            }
            
            // 如果响应包含 markdown 格式的 JSON
            if (response.contains("```json")) {
                return response.substring(
                    response.indexOf("```json") + 7,
                    response.lastIndexOf("```")
                ).trim();
            }
            
            return response;
            
        } catch (Exception e) {
            log.error("JSON提取失败", e);
            return response;
        }
    }
    
    private Map<String, Object> parseResponse(String aiResponse) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            log.info("原始响应: {}", aiResponse);
            
            // 查找第一个 { 和最后一个 } 的位置
            int start = aiResponse.indexOf("{");
            int end = aiResponse.lastIndexOf("}") + 1;
            
            if (start == -1 || end == 0) {
                log.error("响应中未找到有效的 JSON 结构");
                return createFallbackResponse(aiResponse);
            }
            
            // 提取 JSON 部分
            String jsonPart = aiResponse.substring(start, end);
            log.info("提取的 JSON: {}", jsonPart);
            
            return mapper.readValue(jsonPart, new com.fasterxml.jackson.core.type.TypeReference<Map<String, Object>>() {});
        } catch (Exception e) {
            log.error("响应处理失败", e);
            return createFallbackResponse(aiResponse);
        }
    }
    
    private Map<String, Object> createFallbackResponse(String rawResponse) {
        Map<String, Object> fallback = new HashMap<>();
        fallback.put("error", "UI识别结果解析失败");
        fallback.put("rawResponse", rawResponse);
        return fallback;
    }
}